# -*- coding: utf-8 -*-
import sys

estado=0
palabra=''
tabla=[]
reservadas = ['if','else','switch','case','for','while','do','void','int','float','double','char','short','long','signed','unsigned','include','define','inline','return','main']
selectivas = ['if','else','switch','case']
repetitivas = ['for','while','do']
tiposd = ['void','int','float','double','char']
calificadores = ['short','long','signed','unsigned']
preprocesador = ['include','define','inline']
returnl = ['return']
mainl = ['main']
numLineas = 1

def Cero(c):
	global estado
	global palabra
	if c.isalpha() or isguion(c):
		estado = 1
		palabra += c
	else:
		#print 'no es letra'
		palabra = ''
		###AQUI SE LO PASO AL AUTOMATA QUE SIGUE***************************
		estado=2###Faltaba!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		#!!!esto lo envia al sig autómata para que analice todos los caracteres q vienen dsps 
		#y siempre empiecen (para este caso) en el estado 2.
		Dos(c)


def Uno(c):
	global estado
	global palabra

	if c.isalpha() or c.isdigit() or isguion(c):
		estado = 1
		palabra += c
	else:
		#estado = 2
		EdoFinal()
		###AQUI SE LO PASO AL AUTOMATA QUE SIGUE***************************
		Dos(c)


def EdoFinal():
	global estado
	global palabra
	global reservadas
	if palabra in reservadas:
		print 'reservada => ',
		print palabra
		ti = tipo_id(palabra)
		tabla.append([ti,palabra,palabra])
	else:
		tabla.append(['IDENTFICADOR',palabra,palabra])
		print 'identificador => ',
		print palabra
	estado=0
	palabra=''


def Dos(c):
	global estado

	print "...De esto se encarga el siguiente autómata: " + c
	estado=0

def tipo_id(ti):
	if ti in selectivas:
		return "ESTRUCTURA SELECTIVA"
	if ti in repetitivas:
		return "ESTRUCTURA REPETITIVA"
	if ti in tiposd:
		return "TIPO DE DATO"
	if ti in calificadores:
		return "CALIFICADOR DE TIPO DE DATO"
	if ti in preprocesador:
		return "INSTRUCCION DEL PREPROCESADOR"
	if ti in returnl:
		return "RETURN"
	if ti in mainl:
		return "MAIN"


def isguion(c):
	if c=='_':
		return True
	else:
		return False

def main():

	global palabra
	global tabla
	global estado
	global numLineas

	archivo_entrada = open(sys.argv[1])
	tabla_simbolos = open(sys.argv[2],'w')
	archivo_errores = open(sys.argv[3],'w')

	#print archivo_entrada.readlines()
	##lll = archivo_entrada.readlines()
	##print lll
	#print type(lll[1][1])

	Switch={
		0:Cero,
		1:Uno,
		2:Dos,
	}

	while 1:
	    char = archivo_entrada.read(1)          # read by character
	    if not char: 
	    	break
	    ####codigo####
	    if char==' ' or char=='\r' or char=='\n':
	    	#print "ERR: " + char
	    	if palabra!='':
	    		EdoFinal()
	    		#print "EDO FINAL"
	    	palabra=''
	    	estado=0
	    	if char=='\n':
	    		numLineas += 1
	    	continue
	    else:
	    	#print 'ch: ' + char
	    	#print 'edo: ' + str(estado)
	    	Switch[estado](char)
    	####codigo####

	for p in tabla:
		tabla_simbolos.write(p[0] + '\t' + p[1] + '\t' + p[2] + '\r\n')

	archivo_entrada.close()
	tabla_simbolos.close()
	archivo_errores.close()

	print "numLineas: " + str(numLineas)

if __name__=="__main__":
	main()

###INFO:
# El salto de línea en linux es: \r\n
# -> El que lee char x char, toma a \r y \n como un solo char :D